EmoTrack 2:情绪分

第2次迭代,将命中 EmoTrack 的核心功能,跟踪情绪。

灵感来自于 rating 打分组件,简化一些,设置数个 emoji,分配对应的得分:

EmoScore

UI 组件实现完成后,下面考虑如何实现逻辑。

首先是数据实体 EmoScore,需要创建一个新 model。

model 中我设计一个key:2023102213,以小时作为时间戳,而不是以秒作为时间戳。存为 int 类型。

这样,我后续在统计绘图的时候,可以直接 select。

之所以用小时作为时间戳,希望在每天不同时段,都可以进行情绪选择。

为什么不用更细粒度?比如分钟?那样变化过于频繁,用户操作起来很累。

class EmoScore extends Table {  
  IntColumn get id => integer().autoIncrement()();  
  DateTimeColumn get hourTimestamp => dateTime().unique()();  
  IntColumn get score => integer()();  
}

增删改查逻辑

首页有个定时器,需要由他来生成 hourTimestamp,并传入打分组件中。

并且通过 ValueKey,每次 hourTimestamp 变更后,打分组件会自动变更。

这样,只需要在打分组件内部,自己的生命周期里实现创造时查,变更时改就可以了。

获取,注意返回是可空的:

Future<EmoScoreData?> getSingleEmoScoreByTs(DateTime dt) =>  
    (select(emoScore)..where((t) => t.hourTimestamp.equals(dt)))  
        .getSingleOrNull();

下面是点击 Emoji 后的修改逻辑。还是 insertOnConflictUpdate 方法,一招鲜。

具体在点击回调中,还是要处理新建和修改的逻辑,参考 Todo 添加页,还是分开处理。

migration

在 Drift 中,新增表,需要进行 migration 操作。

之所以选择 Drift,是因为它在 migration 上提供诸多遍历,到了体验的时候。文档1

Drift migration 便利性体现在两方面:

我感觉,使用 helper 进行手动 migration 就足够方便了。

数据库也升级到 v2 了。

migration 代码如下:

MigrationStrategy get migration {  
  return MigrationStrategy(onCreate: (Migrator m) async {  
    m.createAll();  
  }, onUpgrade: (Migrator m, int from, int to) async {  
    if (from < 3) {  
      /// version 2  
      await m.createTable(emoScore);  
    }  
  });  
}

找到一篇好文章《【Flutter】Driftのマイグレーション》,文章中提到一个库《drift_db_viewer | Flutter Package》对数据库进行统一浏览,正好满足我的需要。

Bingo!


本文作者:Maeiee

本文链接:EmoTrack 2:情绪分

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!